home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / taropyon / silib / silib.lzh / PRG / SDKFS / FSELREAD.C < prev    next >
C/C++ Source or Header  |  1993-11-20  |  4KB  |  232 lines

  1. /*************************************************************************
  2. *    âtâ@âCâïÅεò±é╠ô╟é▌ĵéΦ
  3. *************************************************************************/
  4.  
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <dos.h>
  9.  
  10. #include    <silib.h>
  11. #include    <sifs.h>
  12. #include    "sdkfs.h"
  13. #include    "sdkfscf.h"
  14.  
  15. /*************************************************************************
  16. *    âtâ@âCâïÅεò±é╠Åëè·ë╗
  17. *************************************************************************/
  18.  
  19. void    FileSel_clearFndat( FILESEL_T *fs )
  20. {
  21.     FNDAT_T    *fndat, *next;
  22.  
  23.     fndat = fs->fnTop;
  24.     while ( fndat )
  25.     {
  26.         next = fndat->next;
  27.         SI_FREE(fndat);
  28.         fndat = next;
  29.     }
  30.     fs->fnTop = NULL;
  31.  
  32.     if ( fs->fnMat )
  33.         SI_FREE(fs->fnMat);
  34.     fs->fnMat = NULL;
  35.  
  36.     fs->numFn = fs->numMat = fs->posDspTop = 0;
  37.     fs->posMark = -1;
  38. }
  39.  
  40.  
  41. static FNDAT_T    *readdir(void)
  42. {
  43.     int                        ret;
  44.     REG FNDAT_T                *fndat;
  45.     static int                opflg = FALSE;
  46.     static int                no;
  47.     static struct find_t    fbuf;
  48.  
  49.     if ( opflg == FALSE )    /*    Åëë±âRü[âï    */
  50.     {
  51.         ret = _dos_findfirst( "*.*", 0x16, &fbuf);
  52.         opflg = TRUE;
  53.         no = 0;
  54.     } else
  55.         ret = _dos_findnext( &fbuf );
  56.  
  57.     if ( ret )    /* error */
  58.     {
  59.         opflg = FALSE;
  60.         return (NULL);
  61.     }
  62.  
  63.     if ( (fndat = SI_MALLOC(sizeof(FNDAT_T))) != NULL )
  64.     {
  65.         fndat->next = NULL;
  66.         fndat->no   = no++;
  67.         fndat->flag = FALSE;
  68.         fndat->mark = FALSE;
  69.         fndat->buf  = fbuf;
  70.         if ( !(fndat->buf.attrib & FSATT_DIR) )
  71.             FS_strlwr( fndat->buf.name );    /* Å¼ò╢ÄÜé╔ò╧è╖    */
  72.     }
  73.     return (fndat);
  74. }
  75.  
  76. /*************************************************************************
  77. *    âfâBâîâNâgâèÅεò±é╠ô╟é▌ĵéΦ
  78. *************************************************************************/
  79.  
  80. int        FileSel_readdir( FILESEL_T *fs )
  81. {
  82.     FNDAT_T        *fndat;
  83.  
  84.     FileSel_clearFndat( fs );
  85.  
  86.     {
  87.         long    totalFree, writeFree;
  88.  
  89.         if ( FS_getDskFree( fs->drv, &totalFree, &writeFree) )
  90.         {
  91.             fs->err = FSERR_DRIVE;
  92.             return (ERR);
  93.         }
  94.     }
  95.  
  96.     while ( (fndat = readdir()) != NULL )
  97.     {
  98.         ++(fs->numFn);
  99.         if ( fs->fnTop )
  100.         {
  101.             fndat->next = fs->fnTop;
  102.             fs->fnTop = fndat;
  103.         } else
  104.         {
  105.             fndat->next = NULL;
  106.             fs->fnTop = fndat;
  107.         }
  108.     }
  109.  
  110.     return (NORMAL);
  111. }
  112.  
  113.  
  114. static int        wildMatch( CONST char *s )
  115. {
  116.     char    buf[256];
  117.  
  118.     if ( strchr(s, '.') == NULL )
  119.     {    /* ègÆúÄqé═ÄwÆΦé│éΩé─éóé╚éó    */
  120.         /* âsâèâIâhé╛é»Æ╟ë┴    */
  121.         sprintf(buf,"%s%c",s, '.');
  122.         return FS_wildMatch( buf );
  123.     } else
  124.         return FS_wildMatch( s );
  125. }
  126.  
  127. /*************************************************************************
  128. *    âtâ@âCâïé╠æIæ≡üiâÅâïâCâhâJü[âhüj
  129. *************************************************************************/
  130.  
  131. int        FilsSel_pickup( FILESEL_T *fs )
  132. {
  133.     int        ai, argc;
  134.     char    **argv;
  135.     char    *wild;
  136.  
  137.     if ( fs->numFn == 0 )
  138.     {
  139.         fs->err = FSERR_FILE;
  140.         return (ERR);
  141.     }
  142.     if ( fs->wild == NULL || (fs->wild && fs->wild[0] == '\0') )
  143.         wild = "*.*";
  144.     else
  145.         wild = fs->wild;
  146.  
  147.     {
  148.         FNDAT_T        *fndat;
  149.  
  150.         fndat = fs->fnTop;
  151.         while ( fndat )
  152.         {
  153.             fndat->flag = FALSE;
  154.             fndat = fndat->next;
  155.         }
  156.     }
  157.  
  158.     if ( fs->fnMat )
  159.     {
  160.         SI_FREE(fs->fnMat);
  161.         fs->fnMat = NULL;
  162.     }
  163.     fs->numMat = fs->posDspTop = 0;
  164.  
  165.     if ( SI_argSet( &argc, &argv, wild) )
  166.         return (ERR);
  167.     for ( ai = 0; ai < argc; ++ai )
  168.     {
  169.         FNDAT_T        *fndat;
  170.  
  171.         FS_wildSet( argv[ai] );
  172.         fndat = fs->fnTop;
  173.         while ( fndat )
  174.         {
  175.             if( fndat->flag == FALSE )
  176.             {
  177.                 if ( (fndat->buf.attrib & FSATT_DIR) || wildMatch( fndat->buf.name ) )
  178.                 {
  179.                     ++(fs->numMat);
  180.                     fndat->flag = TRUE;
  181.                 }
  182.             }
  183.             fndat = fndat->next;
  184.         }
  185.         FS_wildFree();
  186.     }
  187.     SI_argFree( argc, argv );
  188.  
  189.     if ( fs->numMat == 0 )
  190.     {
  191.         fs->err = FSERR_FILE;
  192.         return (ERR);
  193.     }
  194.  
  195.     if ( fs->numMat > 0 )
  196.     {    /* â}âbâ`é╡é╜âtâ@âCâïÅεò±é╠É▌ÆΦ    */
  197.         FNDAT_T        *fndat;
  198.         int            i = 0;
  199.  
  200.         if ( (fs->fnMat = SI_MALLOC(sizeof(FNDAT_T *) * fs->numMat)) == NULL )
  201.         {
  202.             fs->numMat = 0;
  203.             fs->err = FSERR_MEMORY;
  204.             return (ERR);
  205.         }
  206.  
  207.         fndat = fs->fnTop;
  208.         while ( fndat )
  209.         {
  210.             if ( fndat->flag )
  211.                 fs->fnMat[i++] = fndat;
  212.             fndat = fndat->next;
  213.         }
  214.     }
  215.     return (NORMAL);
  216. }
  217.  
  218. int        FileSel_changedir( FILESEL_T *fs )
  219. {
  220.     fs->posMark = -1;
  221.     fs->err = FSERR_NOERR;
  222.  
  223.     FS_chdir2( fs->whare );
  224.     if ( FileSel_readdir( fs ) )
  225.         return (ERR);
  226.     if ( FilsSel_pickup( fs ) )
  227.         return (ERR);
  228.     FileSel_sort( fs );
  229.  
  230.     return (NORMAL);
  231. }
  232.